home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Ports / mac / menu.c < prev    next >
Text File  |  1995-12-21  |  4KB  |  267 lines

  1. /* MAC STDWIN -- MENUS. */
  2.  
  3. /* XXX Ought to find a way to allow the THINK C console menus
  4.    to work when the console is active */
  5.  
  6. #include "macwin.h"
  7. #include <Fonts.h>
  8. #include <Menus.h>
  9. #include <ToolUtils.h>
  10. #include <Desk.h>
  11.  
  12. #define MENUID(mp) ((*((MenuHandle)(mp)))->menuID)
  13.  
  14. bool _wmenuhilite;        /* Set if HiliteMenu(0) needed */
  15.  
  16. static bool deflocal= FALSE;    /* Default menu state */
  17.  
  18. static int firstlocal;        /* First local menu in menu bar */
  19.  
  20. /* Function prototypes */
  21.  
  22. STATIC void addtobar _ARGS((struct menubar *mbp, MENU *mp));
  23. STATIC void delfrombar _ARGS((struct menubar *mbp, MENU *mp));
  24.  
  25. static void
  26. addtobar(mbp, mp)
  27.     struct menubar *mbp;
  28.     MENU *mp;
  29. {
  30.     int i;
  31.     
  32.     for (i= 0; i < mbp->nmenus; ++i) {
  33.         if (mp == mbp->menulist[i])
  34.             return; /* Already attached */
  35.     }
  36.     L_APPEND(mbp->nmenus, mbp->menulist, MENU *, mp);
  37. }
  38.  
  39. static void
  40. delfrombar(mbp, mp)
  41.     struct menubar *mbp;
  42.     MENU *mp;
  43. {
  44.     int i;
  45.     
  46.     for (i= 0; i < mbp->nmenus; ++i) {
  47.         if (mp == mbp->menulist[i]) {
  48.             L_REMOVE(mbp->nmenus, mbp->menulist, MENU *, i);
  49.             break;
  50.         }
  51.     }
  52. }
  53.  
  54. MENU *
  55. wmenucreate(id, title)
  56.     int id;
  57.     char *title;
  58. {
  59.     MenuHandle mp= NewMenu(id, PSTRING(title));
  60.     
  61.     if (!deflocal) {
  62.         InsertMenu(mp, firstlocal);
  63.         DrawMenuBar();
  64.     }
  65.     return (MENU *)mp;
  66. }
  67.  
  68. void
  69. wmenudelete(mp)
  70.     MENU *mp;
  71. {
  72.     WindowPtr w;
  73.     
  74.     for (w= FrontWindow(); w != NULL;
  75.         w= (WindowPtr)((WindowPeek)w)->nextWindow) {
  76.         WINDOW *win= whichwin(w);
  77.         if (win != NULL)
  78.             delfrombar(&win->mbar, mp);
  79.     }
  80.     DeleteMenu(MENUID(mp));
  81.     DrawMenuBar();
  82.     DisposeMenu((MenuHandle)mp);
  83. }
  84.  
  85. int
  86. wmenuadditem(mp, text, shortcut)
  87.     MENU *mp;
  88.     char *text;
  89.     int shortcut;
  90. {
  91.     char buf[256];
  92.     int item;
  93.     
  94.     if (text == NULL || *text == EOS)
  95.         strcpy(buf, "(-");
  96.     else
  97.         strcpy(buf, "x");
  98.     if (shortcut >= 0) {
  99.         char *p= buf + strlen(buf);
  100.         *p++= '/';
  101.         *p++= shortcut;
  102.         *p= EOS;
  103.     }
  104.     AppendMenu((MenuHandle)mp, PSTRING(buf));
  105.     item= CountMItems((MenuHandle)mp);
  106.     if (text != NULL && *text != EOS)
  107.         SetItem((MenuHandle)mp, item, PSTRING(text));
  108.     return item-1;
  109. }
  110.  
  111. void
  112. wmenusetitem(mp, item, text)
  113.     MENU *mp;
  114.     int item;
  115.     char *text;
  116. {
  117.     ++item;
  118.     if (text == NULL || *text == EOS)
  119.         DisableItem((MenuHandle)mp, item);
  120.     else {
  121.         EnableItem((MenuHandle)mp, item);
  122.         SetItem((MenuHandle)mp, item, PSTRING(text));
  123.     }
  124. }
  125.  
  126. void
  127. wmenuenable(mp, item, flag)
  128.     MENU *mp;
  129.     int item;
  130.     int flag;
  131. {
  132.     ++item;
  133.     if (flag)
  134.         EnableItem((MenuHandle)mp, item);
  135.     else
  136.         DisableItem((MenuHandle)mp, item);
  137. }
  138. void
  139. wmenucheck(mp, item, flag)
  140.     MENU *mp;
  141.     int item;
  142.     int flag;
  143. {
  144.     ++item;
  145.     CheckItem((MenuHandle)mp, item, flag);
  146. }
  147.  
  148. void
  149. wmenuattach(win, mp)
  150.     WINDOW *win;
  151.     MENU *mp;
  152. {
  153.     addtobar(&win->mbar, mp);
  154.     if (win == active) {
  155.         InsertMenu((MenuHandle)mp, 0);
  156.         DrawMenuBar();
  157.     }
  158. }
  159.  
  160. void
  161. wmenudetach(win, mp)
  162.     WINDOW *win;
  163.     MENU *mp;
  164. {
  165.     delfrombar(&win->mbar, mp);
  166.     if (win == active) {
  167.         DeleteMenu(MENUID(mp));
  168.         DrawMenuBar();
  169.     }
  170. }
  171.  
  172. void
  173. wmenusetdeflocal(local)
  174.     bool local;
  175. {
  176.     deflocal= local;
  177. }
  178.  
  179. /* Interface routines for the rest of the library. */
  180.  
  181. void
  182. initmbar(mb)
  183.     struct menubar *mb;
  184. {
  185.     L_INIT(mb->nmenus, mb->menulist);
  186. }
  187.  
  188. void
  189. killmbar(mb)
  190.     struct menubar *mb;
  191. {
  192.     L_DEALLOC(mb->nmenus, mb->menulist);
  193. }
  194.  
  195. void
  196. addlocalmenus(win)
  197.     WINDOW *win;
  198. {
  199.     int i;
  200.     
  201.     firstlocal= 0;
  202.     for (i= 0; i < win->mbar.nmenus; ++i) {
  203.         if (firstlocal == 0)
  204.             firstlocal= MENUID(win->mbar.menulist[i]);
  205.         InsertMenu((MenuHandle)win->mbar.menulist[i], 0);
  206.     }
  207.     if (i > 0)
  208.         DrawMenuBar();
  209. }
  210.  
  211. void
  212. rmlocalmenus(win)
  213.     WINDOW *win;
  214. {
  215.     int i;
  216.     
  217.     firstlocal= 0;
  218.     for (i= 0; i < win->mbar.nmenus; ++i)
  219.         DeleteMenu(MENUID(win->mbar.menulist[i]));
  220.     if (i > 0)
  221.         DrawMenuBar();
  222. }
  223.  
  224. void
  225. _wdo_menu(ep, menu_item)
  226.     EVENT *ep;
  227.     long menu_item;
  228. {
  229.     int id= HiWord(menu_item);
  230.     int item= LoWord(menu_item);
  231.     
  232.     if (id == 0)
  233.         return;
  234.     if (id == APPLE_MENU) {
  235.         if (item == 1)
  236.             do_about();
  237.         else {
  238.             Str255 name;
  239.             GetItem(GetMHandle(id), item, name);
  240.             (void) OpenDeskAcc(name);
  241.         }
  242.         HiliteMenu(0);
  243.     }
  244.     else {
  245.         ep->type= WE_MENU;
  246.         ep->u.m.id= id;
  247.         ep->u.m.item= item-1;
  248.         _wmenuhilite= TRUE;
  249.     }
  250. }
  251.  
  252. /* Call this routine exactly once to initialize the Apple menu. */
  253.  
  254. char *about_item= "About STDWIN...";
  255.  
  256. void
  257. setup_menus()
  258. {
  259.     static char applename[2]= {appleMark, EOS};
  260.     MenuHandle m;
  261.     
  262.     m= (MenuHandle)wmenucreate(APPLE_MENU, applename);
  263.     AppendMenu(m, PSTRING(about_item));
  264.     AppendMenu(m, PSTRING("(-"));
  265.     AddResMenu(m, 'DRVR');
  266. }
  267.